练习
(1)下面的代码存在什么错误?
public sealed class MyClass
{
// Class members.
}
public class myDerivedClass : MyClass
{
// Class members.
}
答案:myDerivedClass派生于MyClass,但是MyClass是密封的,不能从MyClass中派生其他类。
(2)如何定义不能创建的类(noncreatable class)?
答案:要定义不能创建的类,可以将其定义为静态类,或者将其所有构造函数定义为私有。
(3)为什么不能创建的类仍旧有用?如何利用它们的功能?
不能创建的类可以通过它们拥有的静态成员来使用。实际上,甚至可以通过这些成员获取这些类的实例,如下所示:
class CreateMe { private CreateMe() {} static public CreateMe GetCreateMe() { return new CreateMe(); } }
这里,公共函数可以访问私有构造函数,因为它在同一个类的定义中。
(4)在类库项目 Vehicles
中编写代码,实现本章前面讨论的 Vehicle
对象系列,其中有 9 个对象和 2 个接口需要实现。
答案: 为简单起见,下面的类定义显示为一个代码文件的一部分,而没有给每个类定义列出单独的代码文件:
namespace Vehicles { public abstract class Vehicle {} public abstract class Car : Vehicle {} public abstract class Train : Vehicle {} public interface IPassengerCarrier {} public interface IHeavyLoadCarrier {} public class SUV : Car, IPassengerCarrier {} public class Pickup : Car, IPassengerCarrier, IHeavyLoadCarrier {} public class Compact : Car, IPassengerCarrier {} public class PassengerTrain : Train, IPassengerCarrier {} public class FreightTrain : Train, IHeavyLoadCarrier {} public class T424DoubleBogey : Train, IHeavyLoadCarrier {} }
(5)创建一个控制台应用程序项目 Traffic
,它引用 Vehicle.dll
(在第(4)题中创建),其中包括函数 AddPassenger()
,它接受任何带有 IPassengerCarrier
接口的对象。要证明代码可以运行,使用支持这个接口的每个对象实例调用该函数,在每个对象上调用派生于 System.Object 的 ToString()
方法,并将结果输出到屏幕上。
答案:
using System; using Vehicles; namespace Traffic { class Program { static void Main(string[] args) { AddPassenger(new Compact()); AddPassenger(new SUV()); AddPassenger(new Pickup()); AddPassenger(new PassengerTrain()); } static void AddPassenger(IPassengerCarrier Vehicle) { Console.WriteLine(Vehicle.ToString()); } } }
🔚